package com.it.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.it.reggie.common.R;
import com.it.reggie.entity.Category;
import com.it.reggie.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


//分类管理
@RestController
@RequestMapping("/category")
@Slf4j
public class CategoryController {
    @Autowired
    private CategoryService categoryService;

    //因为传过来的是json形式，所以要加@RequestBody,才能拿到
    //新增分类
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("category:{}",category);
        categoryService.save(category);
        return R.success("新增分类成功");
    }

    //分页查询
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        //分页构造器
        Page<Category> pageInfo = new Page<>(page,pageSize);
        //（排序）条件构造器//按照Category类里的sort属性排序
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//为Category类创建一个新的LambdaQueryWrapper实例。这允许您使用lambda表达式定义查询条件。
        //添加排序条件，根据sort进行排序
        queryWrapper.orderByAsc(Category::getSort);

        //进行分页查询
        categoryService.page(pageInfo,queryWrapper);
        return R.success(pageInfo);
    }
//创建一个查询条件来查找ID等于1且名称以“electronics”开头的类别。
// selectList方法用于执行查询并检索匹配的类别
//LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//queryWrapper.eq(Category::getId, 1);//Example condition: equal to category ID 1
//queryWrapper.likeRight(Category::getName, "electronics");//Example condition: name starts with "electronics"
//List<Category> categories = categoryMapper.selectList(queryWrapper);

    //根据id删除分类
    @DeleteMapping
    public R<String> delete(Long id){
        log.info("删除分类，id为：{}",id);
        //判断当前的分类是否关联了菜品或者套餐，

        categoryService.remove(id);//remove方法在CategoryServiceImpl

        //categoryService.removeById(id);//继承自mybatis-plus的IService接口
        return R.success("分类信息删除成功");
    }
    //根据id修改分类信息
    @PutMapping//   因为前端传过来的是json数据{id:"..",name:"..",sort: 0},整个封装成Category对象
    public R<String> update(@RequestBody Category category){
        log.info("修改分类信息：{}",category);
        categoryService.updateById(category);

        return R.success("修改分类信息成功");
    }

//根据条件type来查询（backend-page-food-add.html里的392行的方法）从分类表查询到的数据，显示到前端添加菜品页面的菜品分类的下拉框
//前端的请求是http://localhost:8080/category/list?type=1，
// type=1,下拉框展示的是菜品分类，添加套餐页面里的添加菜品按钮里的菜品分类也是请求的这个，type=2，下拉框展示的是套餐分类
    @GetMapping("/list")//参数也可以是String type，实体参数Category category通用性更强，后期传的参数除了type，可能还有其他
    public R<List<Category>> list(Category category){//返回List分类实体集合，//下拉框
        //条件构造器
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();

        //(动态)添加条件//type!=空时，再添加条件，条件检查'category'对象的'type'属性是否不为空，如果是，则将其与'Category'类的'type'属性进行比较
        queryWrapper.eq(category.getType()!=null,Category::getType,category.getType());
//相当于SELECT id,type,name,sort,create_time,update_time,create_user,update_user FROM category WHERE (type = ?)
        System.out.println("最初查到：");//把小写的category的type(传进的参数)和大写的Category的type(分类表里的所有数据)进行对比，
        //type相同的数据存进queryWrapper里，再存进list<Category>容器里，方便输出????????
        List<Category> list1 = categoryService.list(queryWrapper);//list在mybatis-plus里是查询所有，参数是queryWrapper
        list1.forEach(System.out::println);//看看存进list里的都是什么
        //添加排序条件//     优先根据sort进行升排序，如果sort相同，再根据UpdateTime降排序
        queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
//相当于SELECT id,type,name,sort,create_time,update_time,create_user,update_user FROM category WHERE (type = ?) ORDER BY sort ASC,update_time DESC
        System.out.println("排序之后：");
        List<Category> list2 = categoryService.list(queryWrapper);
        list2.forEach(System.out::println);//存进list集合里的都是什么
        return R.success(list2);
        //根据传来的条件，动态的查询分类数据，查完之后，把数据返回给页面，页面通过数据绑定方式，自动显示到下拉框里面去
    }
}
